home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- #include "geom.h"
- #include "vectP.h"
- #include "crayolaP.h"
-
- static char msg[] = "crayVect.c";
-
- void *cray_vect_HasColor(int sel, Geom *geom, va_list args);
- void *cray_vect_HasVColor(int sel, Geom *geom, va_list args);
- void *cray_vect_HasFColor(int sel, Geom *geom, va_list args);
-
- void *cray_vect_UseVColor(int sel, Geom *geom, va_list args);
- void *cray_vect_UseFColor(int sel, Geom *geom, va_list args);
-
- void *cray_vect_EliminateColor(int sel, Geom *geom, va_list args);
-
- void *cray_vect_SetColorAt(int sel, Geom *geom, va_list args);
- void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list args);
-
- void *cray_vect_GetColorAt(int sel, Geom *geom, va_list args);
- void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list args);
-
- #define MAX_METHODS 12
-
- static craySpecFunc methods[] = {
- "crayHasColor", cray_vect_HasColor,
- "crayHasVColor", cray_vect_HasVColor,
- "crayHasFColor", cray_vect_HasFColor,
-
- "crayCanUseVColor", crayTrue,
- "crayCanUseFColor", crayTrue,
-
- "crayUseVColor", cray_vect_UseVColor,
- "crayUseFColor", cray_vect_UseFColor,
-
- "crayEliminateColor", cray_vect_EliminateColor,
-
- "craySetColorAt", cray_vect_SetColorAt,
- "craySetColorAtV", cray_vect_SetColorAtV,
-
- "crayGetColorAt", cray_vect_GetColorAt,
- "crayGetColorAtV", cray_vect_GetColorAtV,
- };
-
- cray_vect_init() {
- crayInitSpec(methods, MAX_METHODS, GeomClassLookup("vect"));
- return 0;
- }
-
- void *cray_vect_HasColor(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- return (void *)(v->ncolor);
- }
-
- void *cray_vect_HasFColor(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- return (void *)((v->ncolor == v->nvec) ? 1 : 0);
- }
-
- void *cray_vect_HasVColor(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- return (void *)((v->ncolor == v->nvert) ? 1 : 0);
- }
-
- void *cray_vect_UseVColor(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- int h, i, j, k;
- ColorA *color, *def;
-
- def = va_arg(args, ColorA *);
-
- /* h = current point
- * i = current polyline
- * j = current point in polyline
- * k = current color index (in cold list of colors)
- */
- color = OOGLNewNE(ColorA, v->nvert, msg);
- for (h = i = k = 0; i < v->nvec; i++) {
- if (v->vncolor[i]) def = &v->c[k];
- for (j = 0; j < abs(v->vnvert[i]); j++) {
- color[h++] = *def;
- if (v->vncolor[i] > 1) def++;
- }
- k += v->vncolor[i];
- v->vncolor[i] = abs(v->vnvert[i]);
- }
-
- if (v->c != NULL) OOGLFree(v->c);
- v->c = color;
- v->ncolor = v->nvert;
- return (void *)geom;
- }
-
- void *cray_vect_UseFColor(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- int h, i, k;
- ColorA *color, *def;
-
- def = va_arg(args, ColorA *);
-
- color = OOGLNewNE(ColorA, v->nvec, msg);
-
- /*
- * i = current polyline
- * j = current vertex of current polyline
- * k = current color
- * h = current vertex of vect
- */
- for (h = i = k = 0; i < v->nvec; i++) {
- switch(v->vncolor[i]) {
- case 1:
- def = &v->c[k++];
- case 0:
- color[i] = *def;
- break;
- default:
- if (v->vncolor[i] != abs(v->vnvert[i])) {
- OOGLError(1, "Illegal # of colors / # of vertices combination.");
- return (void *)0;
- }
- def = &v->c[k + 1];
- color[i] = *def;
- k += abs(v->vnvert[i]);
- break;
- }
- v->vncolor[i] = 1;
- }
-
- if (v->c != NULL) OOGLFree(v->c);
- v->c = color;
- v->ncolor = v->nvec;
-
- return (void *)geom;
- }
-
-
- void *cray_vect_EliminateColor(int sel, Geom *geom, va_list args)
- {
- int i;
- Vect *v = (Vect *)geom;
- if (!crayHasColor(geom, NULL)) return 0;
- if (v->ncolor) OOGLFree(v->c);
- v->c = NULL;
- v->ncolor = 0;
- for (i = 0; i < v->nvec; i++) v->vncolor[i] = 0;
- return (void *)geom;
- }
-
- void *cray_vect_SetColorAt(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- ColorA *color;
- int vindex, findex, *eindex;
- HPoint3 *pt;
-
- color = va_arg(args, ColorA *);
- vindex = va_arg(args, int);
- findex = va_arg(args, int);
- eindex = va_arg(args, int *);
- pt = va_arg(args, HPoint3 *);
- if (vindex != -1) craySetColorAtV(geom, color, vindex, NULL, pt);
- else {
- craySetColorAtV(geom, color, eindex[0], NULL, pt);
- craySetColorAtV(geom, color, eindex[1], NULL, pt);
- }
- return (void *)geom;
- }
-
- void *cray_vect_SetColorAtV(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- ColorA *color;
- int index;
- int i, j, k;
-
- color = va_arg(args, ColorA *);
- index = va_arg(args, int);
- if (index == -1) return NULL;
- for (i = j = k = 0; i < v->nvec;
- i++, j+= abs(v->vnvert[i]), k += v->vncolor[i])
- if (j + abs(v->vnvert[i]) > index) break;
- switch(v->vncolor[i]) {
- case 0:
- return NULL;
- case 1:
- v->c[k] = *color;
- break;
- default:
- v->c[k + (index - j)] = *color;
- break;
- }
-
- return (void *)geom;
- }
-
- void *cray_vect_GetColorAt(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- ColorA *color;
- int vindex, findex, *eindex;
-
- color = va_arg(args, ColorA *);
- vindex = va_arg(args, int);
- findex = va_arg(args, int);
- eindex = va_arg(args, int *);
- if (vindex != -1)
- return (void *)crayGetColorAtV(geom, color, vindex, NULL, NULL);
- else return (void *)crayGetColorAtV(geom, color, eindex[0], NULL, NULL);
- }
-
- void *cray_vect_GetColorAtV(int sel, Geom *geom, va_list args) {
- Vect *v = (Vect *)geom;
- ColorA *color;
- int index;
- int i, j, k;
-
- color = va_arg(args, ColorA *);
- index = va_arg(args, int);
- if (index == -1 || !v->ncolor) return NULL;
- for (i = j = k = 0; i < v->nvec;
- i++, j+= abs(v->vnvert[i]), k += v->vncolor[i])
- if (j + abs(v->vnvert[i]) > index) break;
- switch(v->vncolor[i]) {
- case 1:
- k++;
- case 0:
- *color = v->c[k];
- break;
- default:
- *color = v->c[k + (index - j)];
- break;
- }
-
- return (void *)geom;
- }
-